package top.lcm889.juc.线程相关类;

/**
 * @author Coder-lcm
 * @date 2021/4/11
 */
public class TestThreadLocal {
    public static void main(String[] args) {
        AccountBean accountBean = new AccountBean("初始账户名");
        // 虽然两个线程共享一个账户实例，但是由于使用了ThreadLocal，所有两条线程都会有自己独立的账户名副本，即i==6之后会看到两个不同的账户名
        new MyTest(accountBean, "线程A").start();
        new MyTest(accountBean, "线程B").start();
    }
}
class AccountBean{
    private ThreadLocal<String> name = new ThreadLocal<String>();

    public AccountBean(String name) {
        this.name.set(name);
        // 打印初始的名称
        System.out.println("-------" + this.name.get());
    }

    public String getName() {
        return name.get();
    }

    public void setName(String name) {
        this.name.set(name);
    }
}

class MyTest extends Thread{
    private AccountBean account;

    public MyTest(AccountBean account,String name) {
        super(name);
        this.account = account;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            if (i == 6) {
                // 当i == 6时修改账户名为当前的线程名
                account.setName(getName());
            }
            // 输出同一个账户的账户名和循环变量
            System.out.println(account.getName() + "账户i的值： " + i);
        }
    }
}